/*
 * FSWUniCEUB - 2008
 * 
 * Este arquivo é de propriedade da Fábrica de Software do UniCEUB
 * 
 * Para mais informações entre em contato com a coordenação do
 * curso de Ciência da Computação da instituição.
 */

package br.uniceub.fsw.util;

import java.util.ArrayList;
import java.util.List;

/**
 * Objeto a ser utilizado na montagem de uma grid em tela.
 *
 * @author Bruno
 */
public class TabelaHtml {
    /**
     * Lista de campos (colunas) que aparecerão na grid.
     */
    private List<List> campos;
    
    /**
     * Lista de tipo dos campos (colunas).
     */
    private List<String> tipos;
    
    /**
     * Lista com o título de cada coluna.
     */
    private List<String> titulos;
    
    /**
     * Lista de tamanhos em percentual das colunas na tabela HTML.
     */
    private List<Integer> tamanhos;
    
    /**
     * Lista de status das colunas: true, para visível e, false, para invisível.
     */
    private List<Boolean> status;  
    
    /**
     * Lista de registros no formato String recuperados em banco.
     */
    private List<List> registros;
    
    /**
     * Nome do campo na tela de chamada utilizado para consulta quando
     * um objeto for selecionado.
     */
    private String campoRetorno;

    /**
     * Getter do campoRetorno.
     * 
     * @return Campo de retorno.
     */
    public String getCampoRetorno() {
        return campoRetorno;
    }

    /**
     * Setter do campoRetorno.
     * 
     * @param campoRetorno Campo de retorno na tela chamadora.
     */
    public void setCampoRetorno(String campoRetorno) {
        this.campoRetorno = campoRetorno;
    }
    
    /**
     * Construtor da classe.
     * Inicializa as listas.
     */
    public TabelaHtml() {
        this.campos = new ArrayList<List>();
        this.tipos = new ArrayList<String>();
        this.titulos = new ArrayList<String>();
        this.tamanhos = new ArrayList<Integer>();
        this.status = new ArrayList<Boolean>();
        this.registros = new ArrayList<List>();
    }
    
    /**
     * Adiciona um tipo na ordem que os campos devem aparecer.
     * 
     * @param tipo Tipo do campo.
     */
    public void adicionarTipo(String tipo) {
        this.tipos.add(tipo);
    }
    
    /**
     * Adiciona o título de uma coluna na ordem que elas devem aparecer.
     * 
     * @param titulo Título da coluna.
     */
    public void adicionarTitulo(String titulo) {
        this.titulos.add(titulo);
    }
    
    /**
     * Adiciona um tamanho na lista de tamanhos na ordem que as colunas devem aparecer.
     * 
     * @param tamanho Tamanho da coluna em percentual.
     */
    public void adicionarTamanho(Integer tamanho) {
        this.tamanhos.add(tamanho);
    }
    
    /**
     * Adiciona um status de visibilidade na ordem que as colunas devem aparecer.
     * 
     * @param status Status de visibilidade da coluna.
     */
    public void adicionarStatus(Boolean status) {
        this.status.add(status);
    }
    
    /**
     * Grava as informações dos campos na lista de campos.
     */
    public void gravarCampos() {
        this.campos.add(this.tipos);
        this.campos.add(this.titulos);
        this.campos.add(this.tamanhos);
        this.campos.add(this.status);
    }
    
    /**
     * Adiciona um registro na lista de registros.
     * 
     * @param registro Lista de strings que representam os valores das colunas de um registro.
     */
    public void adicionarRegistro(List<String> registro) {
        this.registros.add(registro);
    }
    
    /**
     * Retorna a lista de campos.
     * 
     * @return Lista de campos.
     */
    public List<List> buscarCampos() {
        return this.campos;
    }
    
    /**
     * Retorna os títulos.
     * 
     * @return Lista de títulos.
     */
    public List<String> buscarTitulos() {
        return this.titulos;
    }
    
    /**
     * Retorna os tipos.
     * 
     * @return Lista de tipos.
     */
    public List<String> buscarTipos() {
        return this.tipos;
    }
    
    /**
     * Retorna os status.
     * 
     * @return Lista de status.
     */
    public List<Boolean> buscarStatus() {
        return this.status;
    }
    
    /**
     * Retorna os tamanhos.
     * 
     * @return Lista de tamanhos.
     */
    public List<Integer> buscarTamanhos() {
        return this.tamanhos;
    }
    
    /**
     * Retorna um registro da lista de registros.
     * 
     * @param index Índice do registro na lista.
     * @return Lista de strings com os valores de um registro.
     */
    public List<String> buscarRegistro(int index) {
        return this.registros.get(index);
    }
    
    /**
     * Retorna a lista de registros.
     * 
     * @return Lista de registros recuperados em banco.
     */
    public List<List> buscarResgistros() {
        return this.registros;
    }
    
    /**
     * Retorna o número de campos.
     * 
     * @return Número de campos.
     */
    public int buscarQuantidadeCampos() {
        return this.campos.get(0).size();
    }
    
    /**
     * Retorna o número de colunas.
     * 
     * @return Número de colunas.
     */
    public int buscarQuantidadeColunas() {
        if(this.registros.size() == 0) {
            return 0;
        }
        
        return this.registros.get(0).size();
    }
    
    /**
     * Retorna o número de registros da tabela.
     * 
     * @return Número de linhas (registros).
     */
    public int buscarQuantidadeLinhas() {
        return this.registros.size();
    }
    
    /**
     * Retorna o tamanho de uma coluna.
     * @param index Índice da coluna.
     * @return Tamanho da coluna em percentual.
     */
    public Integer buscarTamanho(int index) {
        return this.tamanhos.get(index);
    }

    /**
     * Retorna o título de uma coluna.
     * 
     * @param index Índice da coluna.
     * @return Título da coluna.
     */
    public String buscarTitulo(int index) {
        return this.titulos.get(index);
    }

    /**
     * Retorna o tipo da coluna.
     * 
     * @param index Índice da coluna.
     * @return Tipo da coluna.
     */
    public String buscarTipo(int index) {
        return this.tipos.get(index);
    }

    /**
     * Retorna o status de visibilidade da coluna.
     * 
     * @param index Índice da coluna.
     * @return Status de visibilidade.
     */
    public Boolean buscarStatus(int index) {
        return this.status.get(index);
    }
    
    /**
     * Valida se o campo de retorno está preenchido.
     * 
     * @return Status da validação, verdadeiro, para preenchido,
     * false, para vazio.
     */
    public Boolean validarCampos() {
        if(this.campoRetorno == null || this.campoRetorno.equals("")) {
            return false;
        }
        return true;
    }
}
